//
// Created by ZYZ on 2020/6/10.
//

#ifndef TESTALGORITHM_POLYNOMIAL_LINKED_LIST_H
#define TESTALGORITHM_POLYNOMIAL_LINKED_LIST_H
#include "../../include/define.h"
#include "../../include/type_poly.h"
#include "redefinition_linked_list.h"

typedef LinkList polynomial;            //用带表头结点的有序链表表示多项式

#define DestroyPolyn DestroyList        // 与 DestroyList.cpp 中的函数同义不同名，这里使用宏定义替换
//销毁一元多项式 P
//Status DestroyPolyn (polynomial &P);

#define PolynLength ListLength          // 与 DestroyList.cpp.cpp 中的函数同义不同名
//返回一元多项式 P 中的项数
//int PolynLength (polynomial P);

//输人 m 项的系数和指数，建立表示一元多项式的有序链表 P
void CreatPolyn (polynomial &P, int m);

//打印输出一元多项式
void PrintPolyn (polynomial P);

//已知 h 指向线性链表的头结点，将 s 所指结点插入在第一个结点之前
Status InsFirstP(LinkList &L, Link h, Link s);

//已知 h 指向线性链表的头结点，删除链表中的第一个结点并以 q 返回
Status DelFirstP(LinkList &L, Link h, Link &q);

//完成多项式相加运算，即：Pa=Pa+助，并销毁一元多项式 Pb
void AddPolyn (polynomial &Pa, polynomial &Pb);
//另一种写法
void AddPolyn1(polynomial &Pa,polynomial &Pb);

//完成多项式相减运算，即：Pa=Pa-Pb，并销殿一元多项式 Pb
void SubtractPolyn (polynomial &Pa, polynomial &pb);

//完成多项式相乘运算，即：Pa= Pa x Pb，并销殿一元多项式 Pb
void MultiplyPolyn (polynomial &Pa, polynomial &pb);

//依 a 的指数值 < (或 =)( 或 >) b 的指数值，分别返回 -1、0 和 +1
int cmp (term a, term b);

// 若升序链表 L 中存在与 e 满足判定函数 compare() 取值为 0 的元素，则 q 指示 L 中第一个值为 e 的结点的位置，并返回TRUE；
// 否则 q 指示第一个与 e 满足判定函数 compare() 取值 > 0 的元素的前驱的位置，并返回 FALSE（用于一元多项式）
Status LocateElemP(LinkList L, ElemType e, Position & param_pos, int(*compare)(ElemType, ElemType));

//按有序判定函数 compare() 的约定，将值为 e 的结点插入到有序链表 L 的适当位置上
Status OrderInsert(LinkList *L, ElemType e, int(*comp)(ElemType, ElemType));

#endif //TESTALGORITHM_POLYNOMIAL_LINKED_LIST_H